package com.dtx.prototype.shushang;

import com.dtx.prototype.gongyoude.framework.Product;

/**
 * decochar字段中保存的是像装饰方框那样的环绕着字符串的字符。use方法会使用decochar字段中保存的字符
 * 把要显示的字符串框起来。例如,当decochar中保存的字符为'*',use方法接收到的字符串为Hello的时候,显示结果如下
 *  *********
 *  * Hello *
 *  *********
 *  createClone方法用于复制自己，它内部所调用的clone方法是Java语言中定义的方法,用于复制自己。
 *  用于复制自己。在进行复制时,原来实例中的字段的值也会被复制到新的实例中。我们之所以可以调用clone
 *  方法进行复制,仅仅是因为该类实现了java.lang.Cloneable接口。如果没有实现这个接口,在运行时程序将会抛出
 *  CloneNotSupportedException异常,因此必须用try...catch语句块捕捉这个异常。虽然此处MessageBox类只实现了
 *  Product,但是前文讲到过,Product接口继承了java.lang.Cloneable接口,因此程序不会抛出CloneNotSupportedException异常。
 *  此外,需要注意的是,java.lang.Cloneable接口知识起到告诉程序可以调用clone方法的作用,它自身并没有定义任何方法。
 *  只有类自己(或是它的子类)能够调用Java语言中定义的clone方法。当其他类要求复制实例时,必须先调用createClone这样的方法,
 *  然后在该方法内部再调用clone方法。
 */
public class MessageBox implements Product {

    private char decochar;

    public MessageBox(char decochar) {
        this.decochar = decochar;
    }

    @Override
    public void use(String s) {
        int length = s.getBytes().length;
        for (int i = 0; i < length + 4; i++) {
            System.out.print(decochar);
        }

        System.out.println("");

        System.out.println(decochar + " " + s + " " + decochar);

        for (int i = 0; i < length + 4; i++) {
            System.out.print(decochar);
        }

        System.out.println("");


    }

    @Override
    public Product createClone() {

        Product p = null;

        try {
            p = (Product) clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }

        return p;
    }
}
